// 本代码中对错误的处理方式能够让错误信息很容易读
// 函数返回的总是Result,且函数负责抓错,如果函数运行过程中没有错,那么就返回返回Ok(T),T是按需类型,有可能是();
// 如果函数运行过程中出现错误,那么就包起来并返回Err(e),e是按需类型;
// 而调用方采取各种手段对返回的Result进行处理,比如unwarp_or_else+闭包 / match / if let
use std::env;
use std::process;
use minigrep::Config;

fn main() {

    // env::args返回一个迭代器,迭代器也有很多类型,env::args返回的类型是std::env::Args类型的迭代器
    // collect()将一个迭代器转换成一个集合
    let args: Vec<String> = env::args().collect(); 

    // 本函数负责读取传给主程序的参数
    // 使用闭包对Err进行处理,注意这错误的处理方式
    let config = Config::new(&args).unwrap_or_else(|err| {
        // 大部分终端都提供了标准输出和标准错误两种,打印错误应当使用eprintln,正常打印正常信息应当使用println,
        // exec > output.txt ,所有错误都只打印到标准错误中,而println的都被输出到output.txt中
        eprintln!("Problem parsing arguments:{}", err);
        process::exit(-1);
    });

    // 把读到的这套配置传递给run函数去执行真正的查找操作
    if let Err(e) = minigrep::run(config) {
        eprintln!("{}","读取出现了错误");
        println!("Application error: {}", e);
        process::exit(1);
    }
}
